package com.oa.common.utils;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.oa.common.exception.RRException;

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 工具类
 */
public class AppUtils {

    private static byte[] lock = new byte[0];

    // 位数，默认是8位
    private final static long w = 100000000;

    /**
     * 获取uuid
     *
     * @return
     */
    public static String getUUID() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }

    /**
     * 方法说明：将bean转化为另一种bean实体
     *  
     *
     * @param object
     * @param entityClass
     * @return
     */
    public static <T> T convertBean(Object object, Class<T> entityClass) {
        if (null == object) {
            return null;
        }
        return JSON.parseObject(JSON.toJSONString(object), entityClass);
    }

    /**
     * 方法说明：判断字符串是否含有特殊符号
     *
     * @param str
     * @return
     */
    public static boolean isSpecialChar(String str) {
        String regEx = "[ _`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]|\n|\r|\t";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.find();
    }

    /**
     * 正则表达式判断手机号格式
     *
     * @param phone
     * @return
     */
    public static boolean isPhone(String phone) {
        String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$";
        if (phone.length() != 11) {
            return false;
        } else {
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(phone);
            boolean isMatch = m.matches();
            if (isMatch) {
                return true;
            } else {
                return false;
            }
        }
    }

    /**
     * 生成6位随机数
     *
     * @return
     */
    public String randomCodeTest() {
        Random random = new Random();
        String randomCode = "";
        for (int i = 0; i < 10000; i++) {
            int randomNum = random.nextInt(1000000);
            randomCode += String.format("%06d", randomNum);

        }
        return randomCode;
    }

    /**
     * 分页查询时添加条件的方法
     *
     * @param wra         QueryWrapper对象 塞值的时候会用到
     * @param params      接收到的map
     * @param orderColumn 排序字段
     * @param orderType   排序规则(true:正序  false:倒序)
     * @return wra
     */
    public static QueryWrapper setQueryWrapper(QueryWrapper wra, Map<String, Object> params, String orderColumn, boolean orderType) {

        if (params == null) {
            throw new RRException("缺少列名或者所传的map为空");
        }
        // 查询条件(现在前台传过来的模糊查询统一都为name)
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            if (params.get(entry.getKey()) != null && !"".equals(entry.getKey()) && !"page".equals(entry.getKey()) && !"t".equals(entry.getKey()) && !"limit".equals(entry.getKey())) {
                if (entry.getKey().contains("Id") || entry.getKey().contains("id") || entry.getKey().contains("ID")) {
                    wra.eq(entry.getKey(), params.get(entry.getKey()));
                }else if (entry.getKey().contains("top")) {
                } else if (entry.getKey().contains("Time") || entry.getKey().contains("time") || entry.getKey().contains("TIME") || entry.getKey().contains("Date") || entry.getKey().contains("date") || entry.getKey().contains("DATE")) {
                    if(entry.getKey().equals("startDate")){
                        wra.ge("CREATE_DATE", params.get(entry.getKey()));
                    }else if(entry.getKey().equals("endDate")){
                        wra.le("CREATE_DATE", params.get(entry.getKey()));
                    }else{
                        wra.eq(entry.getKey(), params.get(entry.getKey()));
                    }
                }else if (entry.getKey().contains("STATUS") || entry.getKey().contains("status")) {
                    wra.eq(entry.getKey(), params.get(entry.getKey()));
                } else if (!"".equals(entry.getKey()) && !" ".equals(entry.getKey())) {
                    wra.like(entry.getKey(), params.get(entry.getKey()));
                }
            }
        }

        // 排序
        if (orderType) {
            wra.orderByAsc(orderColumn);
        } else {
            wra.orderByDesc(orderColumn);
        }

        return wra;
    }

    /**
     * 返回一个分页数据
     *
     * @param page    IPage对象
     * @param total   总条数
     * @param records 查询出的分页数据
     * @return page
     */
    public static PageUtils setPage(IPage page, long total, List records) {

        if (page == null) {
            throw new RRException("page 是空的");
        }

        if (records == null) {
            throw new RRException("records 是空的");
        }

        page.setTotal(total);
        page.setRecords(records);

        return new PageUtils(page);
    }

    /**
     * 校验非空并且将空字符串的map赋值一个null
     *
     * @param params 条件的map
     * @return params
     */
    public static Map<String, Object> checkMap(Map<String, Object> params) {

        if (params == null) {
            throw new RRException("params 是空的");
        }

        for (String key : params.keySet()) {
            if (params.get(key) != null) {
                if ("".equals(params.get(key))) {
                    params.put(key, null);
                } else {
                    break;
                }
            } else {
                break;
            }
        }

        return params;
    }

    /**
     * @return java.lang.String
     * @Author Ark
     * @Description 时间戳+随机数生成id
     * @Date 10:31 2020/4/13 0013
     * @Param []
     **/
    public static String createID() {
        long r = 0;
        synchronized (lock) {
            r = (long) ((Math.random() + 1) * w);
        }

        return System.currentTimeMillis() + String.valueOf(r).substring(1);
    }

    /**
     * @Author Ark
     * @param query 条件对象
     * @param params 从前台传过来的形参
     * @return page 返回分页对象
     */
    public static IPage getPage(Query query, Map<String, Object> params) {

        IPage page = query.getPage(params);
        page.setPages(page.getCurrent() - 1);

        return page;
    }
}
